﻿// 1101.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>

using namespace std;
/*
http://oj.daimayuan.top/course/22/problem/1179

给出不定方程 ∑ni=1xi=m和 n个限制条件 xi≤bi，其中 m,bi∈N 
求方程的非负整数解的个数。
由于答案很大，输出对109+7取模的结果。

输入格式
第一行两个整数n,m(1≤n≤10,1≤m≤109)，接下来一行n个整数b1,b2,…,bn(1≤bi≤m)。

输出格式
一个数，表示答案。

样例输入
3 5
2 3 4
样例输出
11
*/

typedef long long LL;
const LL MODP = 1e9 + 7;

LL qmi(LL a, LL k, LL p)
{
	LL res = 1;
	while (k)
	{
		if (k & 1) res = (LL)res * a % p;
		a = (LL)a * a % p;
		k >>= 1;
	}
	return res;
}

LL C(LL a, LL b, LL p) {
	if (b > a) return 0;
	LL res = 1;
	for (int i = 1, j = a; i <= b; i++, j--) {
		res = (LL)res * j % p;
		res = (LL)res * qmi(i, p - 2, p) % p;
	}

	return res;
}

int lucas(LL a, LL b, LL p) {
	if (a < p && b < p) return C(a, b, p);
	return (LL)C(a % p, b % p, p) * lucas(a / p, b / p, p) % p;
}


int n, m;
LL ans;
int arr[20];

void dfs(int curridx,int cnt,LL sum) {
	if (n == curridx) {
		if (cnt % 2 == 0) {
			ans += lucas(m + n - 1 - sum, n - 1, MODP);
			ans %= MODP;
		}
		else {
			ans -= lucas(m + n - 1 - sum, n - 1, MODP);
			ans %= MODP;
		}
		return;
	}

	//不选当前
	dfs(curridx + 1, cnt,sum);

	//选择当前 
	cnt++; sum += arr[curridx] + 1;
	dfs(curridx + 1, cnt,sum);
	cnt--; sum -= arr[curridx] + 1;
	
	return;
}

int main()
{
	cin >> n >> m;
	for (int i = 0; i < n; i++) {
		cin >> arr[i];
	}
	dfs(0,0,0);
	if (ans < 0) {
		ans += MODP;
	}
	cout << ans << endl;
	return 0;
}

 